// Copyright (C) 1953-2022 NUDT
// Verilog module name - mux_5to1
// Version: V3.4.0.20220301
// Created:
//         by - fenglin
////////////////////////////////////////////////////////////////////////////
// Description:
//         
///////////////////////////////////////////////////////////////////////////

`timescale 1ns/1ps

module mux_5to1
(
        i_clk  ,
        i_rst_n,
       
        iv_data_1  ,
	    i_data_wr_1,

        iv_data_2  ,
        i_data_wr_2,
        
        iv_data_3  ,
        i_data_wr_3,
        
        iv_data_4  ,
        i_data_wr_4,
        
        iv_data_5  ,
        i_data_wr_5,        

        ov_data,
        o_data_wr,
        
        ov_discard_pkt_cnt_fop_1,
        ov_cut_pkt_cnt_fop_1    ,
        ov_discard_pkt_cnt_fop_2,
        ov_cut_pkt_cnt_fop_2    ,
        ov_discard_pkt_cnt_fop_3,
        ov_cut_pkt_cnt_fop_3    ,
        ov_discard_pkt_cnt_fop_4,
        ov_cut_pkt_cnt_fop_4    ,
        ov_discard_pkt_cnt_fop_5,
        ov_cut_pkt_cnt_fop_5           
    
); 
// I/O
// clk & rst
input                  i_clk;
input                  i_rst_n; 
// pkt input
input	   [8:0]	   iv_data_1  ;
input	         	   i_data_wr_1;
                       
input	   [8:0]	   iv_data_2  ;
input	         	   i_data_wr_2;
                       
input	   [8:0]	   iv_data_3  ;
input	         	   i_data_wr_3;
                       
input	   [8:0]	   iv_data_4  ;
input	         	   i_data_wr_4;

input	   [8:0]	   iv_data_5  ;
input	         	   i_data_wr_5;

output     [8:0]	   ov_data  ;
output     	       o_data_wr;

output     [15:0]      ov_discard_pkt_cnt_fop_1;
output     [15:0]      ov_cut_pkt_cnt_fop_1    ;
output     [15:0]      ov_discard_pkt_cnt_fop_2;
output     [15:0]      ov_cut_pkt_cnt_fop_2    ;
output     [15:0]      ov_discard_pkt_cnt_fop_3;
output     [15:0]      ov_cut_pkt_cnt_fop_3    ;
output     [15:0]      ov_discard_pkt_cnt_fop_4;
output     [15:0]      ov_cut_pkt_cnt_fop_4    ;
output     [15:0]      ov_discard_pkt_cnt_fop_5;
output     [15:0]      ov_cut_pkt_cnt_fop_5    ;

wire       [8:0]	   wv_data_fop2fifo_1  ;
wire       	           w_data_wr_fop2fifo_1;
wire                   w_data_fifo_rden_cos2fifo_1;
wire                   w_data_fifo_empty_fifo2cos_1;
wire       [8:0]       wv_data_fifo_rdata_fifo2cos_1;
wire       [11:0]      wv_fifo_usedw_fifo2fop_1; // lrl  change 11bit to 12bit

wire       [8:0]	   wv_data_fop2fifo_2  ;
wire       	           w_data_wr_fop2fifo_2;
wire                   w_data_fifo_rden_cos2fifo_2;
wire                   w_data_fifo_empty_fifo2cos_2;
wire       [8:0]       wv_data_fifo_rdata_fifo2cos_2;
wire       [7:0]       wv_fifo_usedw_fifo2fop_2;

wire       [8:0]	   wv_data_fop2fifo_3  ;
wire       	           w_data_wr_fop2fifo_3;
wire                   w_data_fifo_rden_cos2fifo_3;
wire                   w_data_fifo_empty_fifo2cos_3;
wire       [8:0]       wv_data_fifo_rdata_fifo2cos_3;
wire       [10:0]      wv_fifo_usedw_fifo2fop_3;

wire       [8:0]	   wv_data_fop2fifo_4  ;
wire       	           w_data_wr_fop2fifo_4;
wire                   w_data_fifo_rden_cos2fifo_4;
wire                   w_data_fifo_empty_fifo2cos_4;
wire       [8:0]       wv_data_fifo_rdata_fifo2cos_4;
wire       [7:0]       wv_fifo_usedw_fifo2fop_4;

wire       [8:0]	   wv_data_fop2fifo_5  ;
wire       	           w_data_wr_fop2fifo_5;
wire                   w_data_fifo_rden_cos2fifo_5;
wire                   w_data_fifo_empty_fifo2cos_5;
wire       [8:0]       wv_data_fifo_rdata_fifo2cos_5;
wire       [7:0]       wv_fifo_usedw_fifo2fop_5;
fifo_overflow_protect#(.pkt_discard_fifousedw(12'h7ff-12'h40),.pkt_cut_fifousedw(12'h7ff-12'h1)) fifo_overflow_protect_1_inst(
    .i_clk               (i_clk  ),
    .i_rst_n             (i_rst_n),

    .iv_data             (iv_data_1  ),
    .i_data_wr           (i_data_wr_1),

    .iv_fifo_usedw       (wv_fifo_usedw_fifo2fop_1),
	.ov_data             (wv_data_fop2fifo_1  ),
	.o_data_wr           (w_data_wr_fop2fifo_1),

    .ov_discard_pkt_cnt  (ov_discard_pkt_cnt_fop_1),
    .ov_cut_pkt_cnt      (ov_cut_pkt_cnt_fop_1    )
);
//`ifdef altera_ip
syncfifo_showahead_aclr_w9d2048 nma_packet_cache_inst(
    .data  (wv_data_fop2fifo_1), 
    .wrreq (w_data_wr_fop2fifo_1),
    .rdreq (w_data_fifo_rden_cos2fifo_1),
    .clock (i_clk),
    .aclr  (!i_rst_n), 
    .q     (wv_data_fifo_rdata_fifo2cos_1),    
    .usedw (wv_fifo_usedw_fifo2fop_1),
    .full  (), 
    .empty (w_data_fifo_empty_fifo2cos_1) 
);

syncfifo_showahead_aclr_w9d256 osp_packet_cache_inst(
    .data  (wv_data_fop2fifo_2), 
    .wrreq (w_data_wr_fop2fifo_2),
    .rdreq (w_data_fifo_rden_cos2fifo_2),
    .clock (i_clk),
    .aclr  (!i_rst_n), 
    .q     (wv_data_fifo_rdata_fifo2cos_2),    
    .usedw (wv_fifo_usedw_fifo2fop_2),
    .full  (), 
    .empty (w_data_fifo_empty_fifo2cos_2) 
);

syncfifo_showahead_aclr_w9d2048 tfp_packet_cache_inst(
    .data  (wv_data_fop2fifo_3), 
    .wrreq (w_data_wr_fop2fifo_3),
    .rdreq (w_data_fifo_rden_cos2fifo_3),
    .clock (i_clk),
    .aclr  (!i_rst_n), 
    .q     (wv_data_fifo_rdata_fifo2cos_3),    
    .usedw (wv_fifo_usedw_fifo2fop_3),
    .full  (), 
    .empty (w_data_fifo_empty_fifo2cos_3) 
);
syncfifo_showahead_aclr_w9d256 pop_packet_cache_inst(
    .data  (wv_data_fop2fifo_4), 
    .wrreq (w_data_wr_fop2fifo_4),
    .rdreq (w_data_fifo_rden_cos2fifo_4),
    .clock (i_clk),
    .aclr  (!i_rst_n), 
    .q     (wv_data_fifo_rdata_fifo2cos_4),    
    .usedw (wv_fifo_usedw_fifo2fop_4),
    .full  (), 
    .empty (w_data_fifo_empty_fifo2cos_4) 
);
syncfifo_showahead_aclr_w9d256 anp_packet_cache_inst(
    .data  (wv_data_fop2fifo_5), 
    .wrreq (w_data_wr_fop2fifo_5),
    .rdreq (w_data_fifo_rden_cos2fifo_5),
    .clock (i_clk),
    .aclr  (!i_rst_n), 
    .q     (wv_data_fifo_rdata_fifo2cos_5),    
    .usedw (wv_fifo_usedw_fifo2fop_5),
    .full  (), 
    .empty (w_data_fifo_empty_fifo2cos_5) 
);
//`endif
`ifdef xilinx_ip
syncfifo_showahead_aclr_w9d2048 nma_packet_cache_inst(
    .din        (wv_data_fop2fifo_1), 
    .wr_en      (w_data_wr_fop2fifo_1),
    .rd_en      (w_data_fifo_rden_cos2fifo_1),
    .clk        (i_clk),
    .srst        (!i_rst_n), 
    .dout       (wv_data_fifo_rdata_fifo2cos_1),    
    .data_count (wv_fifo_usedw_fifo2fop_1),
    .full       (), 
    .empty      (w_data_fifo_empty_fifo2cos_1) 
);
syncfifo_showahead_aclr_w9d256 osp_packet_cache_inst(
    .din        (wv_data_fop2fifo_2), 
    .wr_en      (w_data_wr_fop2fifo_2),
    .rd_en      (w_data_fifo_rden_cos2fifo_2),
    .clk        (i_clk),
    .srst        (!i_rst_n), 
    .dout       (wv_data_fifo_rdata_fifo2cos_2),    
    .data_count (wv_fifo_usedw_fifo2fop_2),
    .full       (), 
    .empty      (w_data_fifo_empty_fifo2cos_2) 
);
syncfifo_showahead_aclr_w9d2048 tfp_packet_cache_inst(
    .din        (wv_data_fop2fifo_3), 
    .wr_en      (w_data_wr_fop2fifo_3),
    .rd_en      (w_data_fifo_rden_cos2fifo_3),
    .clk        (i_clk),
    .srst        (!i_rst_n), 
    .dout       (wv_data_fifo_rdata_fifo2cos_3),    
    .data_count (wv_fifo_usedw_fifo2fop_3),
    .full       (), 
    .empty      (w_data_fifo_empty_fifo2cos_3) 
);
syncfifo_showahead_aclr_w9d256 pop_packet_cache_inst(
    .din        (wv_data_fop2fifo_4), 
    .wr_en      (w_data_wr_fop2fifo_4),
    .rd_en      (w_data_fifo_rden_cos2fifo_4),
    .clk        (i_clk),
    .srst        (!i_rst_n), 
    .dout       (wv_data_fifo_rdata_fifo2cos_4),    
    .data_count (wv_fifo_usedw_fifo2fop_4),
    .full       (), 
    .empty      (w_data_fifo_empty_fifo2cos_4) 
);
syncfifo_showahead_aclr_w9d256 anp_packet_cache_inst(
    .din        (wv_data_fop2fifo_5), 
    .wr_en      (w_data_wr_fop2fifo_5),
    .rd_en      (w_data_fifo_rden_cos2fifo_5),
    .clk        (i_clk),
    .srst        (!i_rst_n), 
    .dout       (wv_data_fifo_rdata_fifo2cos_5),    
    .data_count (wv_fifo_usedw_fifo2fop_5),
    .full       (), 
    .empty      (w_data_fifo_empty_fifo2cos_5) 
);
`endif
fifo_overflow_protect#(.pkt_discard_fifousedw(12'h0ff-12'h40),.pkt_cut_fifousedw(12'h0ff-12'h1)) fifo_overflow_protect_2_inst(
    .i_clk               (i_clk  ),
    .i_rst_n             (i_rst_n),

    .iv_data             (iv_data_2  ),
    .i_data_wr           (i_data_wr_2),

    .iv_fifo_usedw       ({4'b0,wv_fifo_usedw_fifo2fop_2}),
	.ov_data             (wv_data_fop2fifo_2  ),
	.o_data_wr           (w_data_wr_fop2fifo_2),

    .ov_discard_pkt_cnt  (ov_discard_pkt_cnt_fop_2),
    .ov_cut_pkt_cnt      (ov_cut_pkt_cnt_fop_2    )
);

fifo_overflow_protect#(.pkt_discard_fifousedw(12'h7ff-12'h40),.pkt_cut_fifousedw(12'h7ff-12'h1)) fifo_overflow_protect_3_inst(
    .i_clk               (i_clk  ),
    .i_rst_n             (i_rst_n),

    .iv_data             (iv_data_3  ),
    .i_data_wr           (i_data_wr_3),

    .iv_fifo_usedw       ({1'b0,wv_fifo_usedw_fifo2fop_3}),
	.ov_data             (wv_data_fop2fifo_3  ),
	.o_data_wr           (w_data_wr_fop2fifo_3),

    .ov_discard_pkt_cnt  (ov_discard_pkt_cnt_fop_3),
    .ov_cut_pkt_cnt      (ov_cut_pkt_cnt_fop_3    )
);

fifo_overflow_protect#(.pkt_discard_fifousedw(12'h0ff-12'h40),.pkt_cut_fifousedw(12'h0ff-12'h1)) fifo_overflow_protect_4_inst(
    .i_clk               (i_clk  ),
    .i_rst_n             (i_rst_n),

    .iv_data             (iv_data_4  ),
    .i_data_wr           (i_data_wr_4),

    .iv_fifo_usedw       ({4'b0,wv_fifo_usedw_fifo2fop_4}),
	.ov_data             (wv_data_fop2fifo_4  ),
	.o_data_wr           (w_data_wr_fop2fifo_4),

    .ov_discard_pkt_cnt  (ov_discard_pkt_cnt_fop_4),
    .ov_cut_pkt_cnt      (ov_cut_pkt_cnt_fop_4    )
);

fifo_overflow_protect#(.pkt_discard_fifousedw(12'h0ff-12'h40),.pkt_cut_fifousedw(12'h0ff-12'h1)) fifo_overflow_protect_5_inst(
    .i_clk               (i_clk  ),
    .i_rst_n             (i_rst_n),

    .iv_data             (iv_data_5  ),
    .i_data_wr           (i_data_wr_5),

    .iv_fifo_usedw       ({4'b0,wv_fifo_usedw_fifo2fop_5}),
	.ov_data             (wv_data_fop2fifo_5  ),
	.o_data_wr           (w_data_wr_fop2fifo_5),

    .ov_discard_pkt_cnt  (ov_discard_pkt_cnt_fop_5),
    .ov_cut_pkt_cnt      (ov_cut_pkt_cnt_fop_5    )
);


controller_output_schedule controller_output_schedule_inst
(
        .i_clk              (i_clk            ),
        .i_rst_n            (i_rst_n          ),
                                              
	    .i_fifo_empty_1   (w_data_fifo_empty_fifo2cos_1 ),
        .o_fifo_rden_1    (w_data_fifo_rden_cos2fifo_1  ),
        .iv_fifo_rdata_1  (wv_data_fifo_rdata_fifo2cos_1),
                                             
	    .i_fifo_empty_2   (w_data_fifo_empty_fifo2cos_2 ),
        .o_fifo_rden_2    (w_data_fifo_rden_cos2fifo_2  ),
        .iv_fifo_rdata_2  (wv_data_fifo_rdata_fifo2cos_2),
                                           
	    .i_fifo_empty_3   (w_data_fifo_empty_fifo2cos_3 ),
        .o_fifo_rden_3    (w_data_fifo_rden_cos2fifo_3  ),
        .iv_fifo_rdata_3  (wv_data_fifo_rdata_fifo2cos_3),          
                                          
	    .i_fifo_empty_4   (w_data_fifo_empty_fifo2cos_4 ),
        .o_fifo_rden_4    (w_data_fifo_rden_cos2fifo_4  ),
        .iv_fifo_rdata_4  (wv_data_fifo_rdata_fifo2cos_4),

	    .i_fifo_empty_5   (w_data_fifo_empty_fifo2cos_5 ),
        .o_fifo_rden_5    (w_data_fifo_rden_cos2fifo_5  ),
        .iv_fifo_rdata_5  (wv_data_fifo_rdata_fifo2cos_5),         
                                            
        .ov_data            (ov_data          ),
        .o_data_wr          (o_data_wr        )
); 
endmodule